home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / BYacc-CW 1.9 / symtab.c < prev    next >
C/C++ Source or Header  |  1995-05-20  |  2KB  |  114 lines

  1. #include "defs.h"
  2.  
  3. #include <string.h>
  4.  
  5. /* TABLE_SIZE is the number of entries in the symbol table. */
  6. /* TABLE_SIZE must be a power of two.                */
  7.  
  8. #define    TABLE_SIZE 1024
  9.  
  10.  
  11. bucket **symbol_table;
  12. bucket *first_symbol;
  13. bucket *last_symbol;
  14.  
  15.  
  16. static int hash(char *name)
  17. {
  18.     register char *s;
  19.     register int c, k;
  20.  
  21.     assert(name && *name);
  22.     s = name;
  23.     k = *s;
  24.     while ((c = *++s)!=0)
  25.         k = (31*k + c) & (TABLE_SIZE - 1);
  26.  
  27.     return (k);
  28. }
  29.  
  30.  
  31. bucket *make_bucket(char *name)
  32. {
  33.     register bucket *bp;
  34.  
  35.     assert(name);
  36.     bp = (bucket *) MALLOC(sizeof(bucket));
  37.     if (bp == 0) no_space();
  38.     bp->link = 0;
  39.     bp->next = 0;
  40.     bp->name = MALLOC(strlen(name) + 1);
  41.     if (bp->name == 0) no_space();
  42.     bp->tag = 0;
  43.     bp->value = UNDEFINED;
  44.     bp->index = 0;
  45.     bp->prec = 0;
  46.     bp-> class = UNKNOWN;
  47.     bp->assoc = TOKEN;
  48.  
  49.     if (bp->name == 0) no_space();
  50.     strcpy(bp->name, name);
  51.  
  52.     return (bp);
  53. }
  54.  
  55.  
  56. bucket *lookup(char *name)
  57. {
  58.     register bucket *bp, **bpp;
  59.  
  60.     bpp = symbol_table + hash(name);
  61.     bp = *bpp;
  62.  
  63.     while (bp)
  64.     {
  65.     if (strcmp(name, bp->name) == 0) return (bp);
  66.     bpp = &bp->link;
  67.     bp = *bpp;
  68.     }
  69.  
  70.     *bpp = bp = make_bucket(name);
  71.     last_symbol->next = bp;
  72.     last_symbol = bp;
  73.  
  74.     return (bp);
  75. }
  76.  
  77.  
  78. void create_symbol_table(void)
  79. {
  80.     register int i;
  81.     register bucket *bp;
  82.  
  83.     symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
  84.     if (symbol_table == 0) no_space();
  85.     for (i = 0; i < TABLE_SIZE; i++)
  86.     symbol_table[i] = 0;
  87.  
  88.     bp = make_bucket("error");
  89.     bp->index = 1;
  90.     bp->class = TERM;
  91.  
  92.     first_symbol = bp;
  93.     last_symbol = bp;
  94.     symbol_table[hash("error")] = bp;
  95. }
  96.  
  97. void free_symbol_table(void)
  98. {
  99.     FREE(symbol_table);
  100.     symbol_table = 0;
  101. }
  102.  
  103.  
  104. void free_symbols(void)
  105. {
  106.     register bucket *p, *q;
  107.  
  108.     for (p = first_symbol; p; p = q)
  109.     {
  110.     q = p->next;
  111.     FREE(p);
  112.     }
  113. }
  114.